3.7k 词
一、项目打包目前了解到的next项目的打包有三种模式: 静态站点生成(SSG) 12345const nextConfig = { output:'export'};export default nextConfig; 优点: 静态站点生成(SSG): 所有的页面内容都在构建时被预渲染,并生成静态文文件 部署: 适合部署在不支持服务端渲染的环境,比如github Page或者其他静态托管站点托管服务 缺点: 不支持动态路由。 所有的页面都在构建时生成, 无法使用SSR渲染动态数据, 不能使用API路由,也就是说不能使用到编写后端接口的功能,next全栈的优势就没了 可能不是传统意义上的SSR(在页面初次渲染时,能根据不同的条件会返回不同的HTML) 生成的目录结构: 二、混合模式 12345const nextConfig = { output:'standalone'};export default nextConfig; 优点: 独立部署: 使用 output: &...
4.2k 词
基于Github Actions 和 docker 的前端项目CI/CD项目背景​ 最近在写一个管理系统项目的时候出现了一些比较麻烦的问题,由于进度比较赶,项目虽然上线了,但是还需要继续开发,这就涉及到频繁的构建和部署。 ​ 首先讲一下没使用CI/CD 之前的部署方式: 首先使用pnpm build,拿到项目的打包产物.output文件夹 将.output文件夹压缩,并通过服务器可视化工具宝塔,将压缩包上传到指定文件夹下 第一次部署时使用pm2命令pm2 start ./.output/server/index.mjs -name 'xxx'启动项目 以后的部署都直接使用 pm2 restart [name] 即可 后面重构的时候了解到pm2还有文件监听功能, 启动命令就换成了pm2 start ./.output/server/index.mjs -name 'xxx' --watch, 这样就不用每次都打开终端重启pm2 进程了 ​ 但是这种部署方式实在繁琐,我需要通过:1. 手动打包项目, 2. 将打包产物压...
1.1k 词
样式方案传统的CSS书写存在许多弊端,如下: 开发体验欠佳,样式不允许嵌套,传统的后代选择器等等比较繁琐 样式污染问题,需要严格考虑选择器命名和权重,避免样式污染和覆盖 浏览器兼容性问题,需要手动加上-moz-、-webkit、-ms-、-o-等 打包后的代码体积问题 为了解决这些弊端,社区中诞生了不少方案,常见的有五类: css预处理器,如scss、less、和Stylus。这些方案都有自己的一套语法,让CSS允许使用嵌套规则、变量、函数、条件判断、循环等等,大大的增强了样式的灵活性。 css modules,能够将CSS类名处理成哈希值,这样就可以避免同名的情况下的样式污染。如在vite中配置的: 1234567891011121314// index.css -> index.module.csscss: { modules: { // 一般我们可以通过 generateScopedName 属性来对生成的类名进行自定义 // 其中,name 表示当前文件名,local 表示类名 generateScop...
2.1k 词
模块化无模块化标准阶段早在模块化标准还没有诞生的时候,前端领域已经产生了一些模块化的开发手段,如文件划分、命名空间和 IIFE 私有作用域。 (1)文件划分: 文件划分方式是最原始的模块化实现,简单来说就是将应用的状态和逻辑分散到不同的文件中,然后通过 HTML 中的 script 来一一引入。 问题: 模块的变量相当于全局声明和定义,会出现命名冲突的问题 由于变量都在全局定义,我们很难知道某个变量到底属于哪个模块,造成了调试困难 无法清晰的管理模块之间的依赖关系和加载顺序,加载顺序只能通过手动调整script标签的位置实现。 (2)命名空间: 命名空间是模块化的另一种实现手段,它可以解决上述文件划分方式中全局变量定义所带来的一系列问题。通过将每个模块的生命周期指定一个所属的命名空间,达到解决变量污染的问题,具体的实现是在每个模块包裹上windown.命名空间 (3)IIFE(立即执行函数): 相比于命名空间的模块化手段,IIFE实现的模块化安全性要更高,对于模块作用域的区分更加彻底。 我们知道,每个IIFE 即立即执行函数都会创建一个私有的作用域,在私有作用域中...
264 词
组件封装的原则 统一性 API和组件名的定义要符合规范,比如常用的onClick,补药定义成onPress,尺寸的small / middle / large 补药定义成sm / md /lg 单一职责 如何控制组件的颗粒度是一个难题,也是最考验技术的一点 考虑是否有多个组件复用,如果有可以在后续重构 逻辑功能复杂的组件,哪怕只有一个地方用到,也可以单独封装起来 根据页面结构,或者组件结构拆分 复用性 组件复用性设计其实从某种意义上来说是要放弃对组件的控制权,让使用者能够最大限度的进行 DIY 还需要考虑的: 生命周期 通信
1.4k 词
《Vue的设计与实现》——霍春阳响应系统作用与实现1234567891011121314151617181920212223const targetMap = new WeakMap();const obj = new Proxy(data, { // 监听读取操作 get(target, key) { track(target, key); return targer[key]; }; set(target, key, newVal) { target[key] = newVal; triger(targer, key); }})function track(target, key) {}function triger(target, key) {} a. 分支切换导致的副作用冗余问题 cleanup函数 b. 遍历set时导致的无限循环问题 创建一个新的Set数据结构 c. 嵌套副作用函数导致响应式关...
614 词
硬件结构图灵机 纸带 -> 内存 读写头 控制单元 存储单元 运算单元 冯诺依曼模型 运算器 存储器 控制器 输入设备 输出设备 内存中央处理器CPU 内部还有一些组件,常见的有寄存器、控制单元和逻辑运算单元 常用的寄存器种类有: 1. 通用寄存器 1. 指令寄存器 1. 程序计数器 通用寄存器,用来存放需要进行运算的数据; 指令寄存器用来存放当前正在执行以及执行完的指令; 程序计数器用来存放下一条需要执行的指令的地址; 事件总线总线是用于 CPU 和内存以及其他设备之间的通信,总线可分为 3 种: 地址总线 数据总线 控制总线 地址总线,用于指定 CPU 将要操作的内存地址; 数据总线,用于读写内存的数据; 控制总线,用于发送和接收信号,比如中断、设备复位等信号 中断在计算机中,中断是系统用来响应硬件设备请求的一种机制,操作系统收到硬件的中断请求,会打断正在执行的进程,然后调用内核中的中断处理程序来响应请求。 操作系统收到了中断请求,会打断其他进程的运行,所以 中断请求的响应程序 也就是中断处理程序,要尽可能快的执行完,这样可以减少对正常进程运行调度地影响...
228 词
前端学习路线前端基本功HTMLCSSJavascript前后端联调对接ajax、fetchAPI工程化提效框架包管理工具构建工具git部署上线服务器nginxdocker浏览器相关知识浏览器进程浏览器调试工具事件循环浏览器渲染步骤跨端技术多端开发 uniapp taro flutter 小程序原生移动端 react native 计算机基础知识 数据结构 计算机网路 操作系统 计算机组成原理 其它技术SSR 服务端渲染3D埋点监控单元测试性能优化业务技术 单点登录 无感刷新 跨域问题
913 词
国际化方案国际化背景​ 国际化(Internationalization,简称 i18n)是指在软件、网站或应用开发中,使其能够适应不同国家或地区的语言、文化、时间格式、货币符号、法律规范等多样化需求的过程。通过国际化,产品可以更容易地进行本地化(Localization),即根据特定地区的需求进行适应和调整,而无需重新开发整个系统。 国际化的核心目标是设计和构建一个产品,使其能够支持多语言、多地区的使用,并且能够灵活处理各种与地域相关的差异,如文本翻译、日期格式、货币、单位、输入法等。 扩展: 本地化:本地化(Localization, L10n)的核心是将产品适配特定地区的语言、文化、习俗和法律要求,以便为目标市场提供符合当地用户期望的体验。 国际化需要解决的问题 语言翻译 静态文案(前端静态模板文案) 动态文案(服务端下发的动态数据) 样式 不同的语言文案,长度不一样,容易造成样式混乱 图片替换(带有文案的图片) 受文化习惯的影响,部分地区使用从右到左的阅读方式 文化习惯 货币单位 时间格式 准确的文字翻译,受文化风俗的影响,相同的文字可能蕴...